home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #11 / Amiga Plus CD - 2004 - No. 11.iso / AmiSoft / Misc / emu / fbzx.lha / fbzx / sound.c < prev    next >
C/C++ Source or Header  |  2004-08-26  |  3KB  |  138 lines

  1. #include "Z80.h"
  2. #include "computer.h"
  3. #include "emulator.h"
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <sys/ioctl.h>
  8. #include <unistd.h>
  9.  
  10. #ifndef    AMIGA
  11. #include <sys/soundcard.h>
  12. #endif
  13.  
  14. int audio_fd;
  15. char sound_type; // 0=OSS, 1=no sound
  16.  
  17. int sound_init(int wfreq,int wbuff) {
  18.  
  19.     int parameter;
  20.     int parameter2;
  21.     int bytes,stereo;
  22.  
  23.     if(sound_type==1) { // no sound; simulate 8bits mono
  24.         ordenador.sign=0;
  25.         ordenador.format=0;
  26.         ordenador.channels=1;
  27.         ordenador.channels = 1;
  28.         ordenador.freq=48000;
  29.         ordenador.buffer_len=4800; // will wait 1/10 second
  30.         return (0);        
  31.     }
  32.     
  33. #ifndef AMIGA
  34.     audio_fd=open("/dev/dsp",O_WRONLY); // open DSP
  35.     if(audio_fd==-1)
  36.         return (-1);
  37.     
  38.     // set format
  39.     
  40.     if(ioctl(audio_fd,SNDCTL_DSP_GETFMTS, ¶meter2)==-1)
  41.         return (-2);
  42.     
  43.     // Priority: U8, S8, U16LE, S16LE, U16BE, U16LE
  44.     
  45.     if(parameter2 & AFMT_S16_BE)
  46.         parameter = AFMT_S16_BE;
  47.     if(parameter2 & AFMT_U16_BE)
  48.         parameter = AFMT_U16_BE;
  49.     if(parameter2 & AFMT_S16_LE)
  50.         parameter = AFMT_S16_LE;
  51.     if(parameter2 & AFMT_U16_LE)
  52.         parameter = AFMT_U16_LE;
  53.     if(parameter2 & AFMT_S8)
  54.         parameter = AFMT_S8;
  55.     if(parameter2 & AFMT_U8)
  56.         parameter = AFMT_U8;
  57.     
  58.     bytes=0; //8 bits
  59.     stereo=0; // no stereo
  60.     parameter=AFMT_U8;
  61.     if(ioctl(audio_fd,SNDCTL_DSP_SETFMT,¶meter) == -1)
  62.         return (-2);
  63.     
  64.     switch(parameter) {
  65.         case AFMT_U8:
  66.             ordenador.sign=0;
  67.             ordenador.format=0;
  68.             ordenador.channels=1;
  69.         break;
  70.         case AFMT_S8:
  71.             ordenador.sign=-128;
  72.             ordenador.format=0;
  73.             ordenador.channels=1;
  74.         break;
  75.         case AFMT_U16_LE:
  76.             ordenador.sign=0;
  77.             ordenador.format=1;
  78.             ordenador.channels=2;
  79.         break;
  80.         case AFMT_S16_LE:
  81.             ordenador.sign=-128;
  82.             ordenador.format=1;
  83.             ordenador.channels=2;
  84.         break;
  85.         case AFMT_U16_BE:
  86.             ordenador.sign=0;
  87.             ordenador.format=2;
  88.             ordenador.channels=2;
  89.         break;
  90.         case AFMT_S16_BE:
  91.             ordenador.sign=-128;
  92.             ordenador.format=2;
  93.             ordenador.channels=2;
  94.         break;
  95.     }
  96.  
  97.     parameter = 1; // we want mono audio
  98.     if(ioctl(audio_fd,SNDCTL_DSP_CHANNELS, ¶meter)==-1)
  99.         return (-3);
  100.  
  101.     ordenador.channels = parameter;
  102.     
  103.     parameter=48000; // we want, by default, 48000 samples per second
  104.     if(ioctl(audio_fd,SNDCTL_DSP_SPEED, ¶meter)==-1)
  105.         return (-3);
  106.     ordenador.freq=parameter;
  107.             
  108.     if(ordenador.freq<=24000) // the maximum available frequency in lower than 24000?
  109.         parameter=0x002B ; // two buffers with 2048 bytes each one
  110.     else
  111.         parameter=0x002C ; // two buffers with 4096 bytes each one
  112.     if(ioctl(audio_fd,SNDCTL_DSP_SETFRAGMENT, ¶meter)==-1)
  113.         return (-4);
  114.     if(ioctl(audio_fd,SNDCTL_DSP_GETBLKSIZE, ¶meter)==-1)
  115.         return (-4);
  116.     ordenador.buffer_len=parameter;
  117. #else
  118. #warning no sound support yet
  119. #endif
  120.     return(0);
  121. }
  122.  
  123. void sound_play() {
  124.  
  125.     ordenador.current_buffer=sound[0];
  126.     if(sound_type==1) { // no sound
  127.         usleep(75000); // wait 1/20 second
  128.         return;
  129.     }
  130.     
  131.     write(audio_fd,sound[0],ordenador.buffer_len);
  132. }
  133.  
  134. void sound_close() {
  135.     if(sound_type==0)
  136.         close(audio_fd);
  137. }
  138.